﻿using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Text.RegularExpressions;

using DevExpress.XtraEditors;
using DevExpress.XtraGrid;
using DevExpress.XtraReports.UI;
using prjKQXS_UI.View;
using prjKQXS_Report;
using prjKQXS_DLL;
using prjKQXS_DLL.Danh_muc;

namespace prjKQXS_UI.Danh_muc
{
    public partial class frmDMCanBo : DevExpress.XtraEditors.XtraForm
    {
        Color defaultColor; //biến này để lưu lại gvDonVi.Appearance.FocusedRow.BackColor
        public static bool ChiInDLCap1 = false;

        ////Cài đặt lớp này để thay thế chuỗi "Do you want to correct the value ? " của dev trong thông báo xuất hiện ở gvDonVi_InvalidRowException
        //public class MyLocalizer : DevExpress.XtraGrid.Localization.GridLocalizer
        //{
        //    public override string GetLocalizedString(DevExpress.XtraGrid.Localization.GridStringId id)
        //    {
        //        if (id == DevExpress.XtraGrid.Localization.GridStringId.ColumnViewExceptionMessage)
        //            return "";  //Chuỗi thay thế đặt ở đây
        //        return base.GetLocalizedString(id);
        //    }
        //}

        /// <summary>
        /// Biến này tự động được gán khi chọn đơn vị ở lueDonVi.
        /// Giá trị là "TC" nếu cọn "Tất cả", hoặc là mã đơn vị tương ứng với dòng đã chọn.
        /// </summary>
        string MaDV;

        #region form EVENT =======================================================================
        public frmDMCanBo()
        {
            InitializeComponent();
            ucDonVi1.lueDonVi.EditValueChanged += new EventHandler(lueDonVi_EditValueChanged);
        }

        private void frmDMCanBo_Load(object sender, EventArgs e)
        {
            //DevExpress.XtraGrid.Localization.GridLocalizer.Active = new MyLocalizer();

            defaultColor = gvDonVi.Appearance.FocusedRow.BackColor;
            load_rilueChucVu();
            loadLueDonVi();
        }

        private void frmDMCanBo_Shown(object sender, EventArgs e)
        {
            if (BienTc.isQuanHuyen || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.C_BanRong))
                gcolBanRong.Visible = false;

            if (BienTc.isThanhPho == true || BienTc.isQuanHuyen == true || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_ThemCanBo))
                sbtnThem.Visible = false;

            if (BienTc.isThanhPho == true || BienTc.isQuanHuyen == true || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_XoaCanBo))
                sbtnXoa.Visible = false;

            cbtnSua.Enabled = clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_SuaDMCanBo);
        }

        private void frmDMCanBo_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (frmMain.sEdittingFormName.Contains(this.Name))
            {
                string msg = "Bạn đang thực hiện thêm mới hoặc chỉnh sửa cán bộ nhưng dữ liệu chưa được lưu.\n" +
                    "Bạn vẫn muốn thoát khỏi danh mục cán bộ?";
                if (MessageBox.Show(msg, "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
                    e.Cancel = true;
                else
                {
                    gvDonVi.CancelUpdateCurrentRow();
                    frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
                    this.Close();
                }
            }
        }
        #endregion ================================================================================


        #region Control ===========================================================================
        private void rgThanhly_SelectedIndexChanged(object sender, EventArgs e)
        {
            load_gcDonVi_DataSource();
        }

        private void cbtnSua_CheckedChanged(object sender, EventArgs e)
        {
            if (cbtnSua.Checked)
            {
                cbtnSua.Text = "Khóa";
            }
            else
            {
                chkKhoiPhuc.Checked = false;
                cbtnSua.Text = "Sửa";
                load_gcDonVi_DataSource();
            }

            if (gvDonVi.GetDataRow(GridControl.NewItemRowHandle) != null) //Nếu có dòng đang thêm mới trong gvDonVi
            {
                load_gcDonVi_DataSource();
            }

            sbtnThem.Enabled = cbtnSua.Checked;
            sbtnXoa.Enabled = cbtnSua.Checked;
            gvDonVi_DataSourceChanged(sender, e);
            chkKhoiPhuc.Enabled = cbtnSua.Checked;
            gvDonVi.OptionsBehavior.Editable = cbtnSua.Checked;
        }

        private void sbtnThem_Click(object sender, EventArgs e)
        {
            if (((DataTable)gcCanBo.DataSource).Rows.Count < 36)
            {
                this.Text = this.Text.Replace("*", "");
                this.Text += "*";

                enableControlForAddNew(false);
                gvDonVi.AddNewRow();

                clsDMCanBo cb = new clsDMCanBo();
                cb.OnError += new clsDMCanBo.OnErrorHandler(cls_OnError);
                gvDonVi.SetFocusedRowCellValue("Ma_DT", cb.generateMaCB(MaDV));
                
                gvDonVi.SetFocusedRowCellValue("Ma_DMDonVi", MaDV);
                gvDonVi.FocusedColumn = gcolTenCB;
                gvDonVi.ShowEditor();
            }
            else
            {
                string s = "Không thể thêm cán bộ cho đơn vị này, vì mỗi đơn vị không thể chứa hơn 36 cán bộ";
                XtraMessageBox.Show(s, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void sbtnXoa_Click(object sender, EventArgs e)
        {
            clsDMCanBo cb = new clsDMCanBo();
            cb.OnAction += new clsDMCanBo.OnActionHandler(cls_OnAction);
            cb.OnError += new clsDMCanBo.OnErrorHandler(cls_OnError);

            if (chkKhoiPhuc.Checked)
            {
                if (gcCanBo.DataSource != null 
                    && ((DataTable)gcCanBo.DataSource).Rows.Count > 0)
                {
                    string s = "Ở chế độ khôi phục sẽ bị xóa hoàn toàn khỏi hệ thống, các thông tin liên quan đến cán bộ cũng sẽ bị xóa theo.\n" +
                        "Bạn có chắc chắn xóa cán bộ này?";
                    if (clsCommon.MsgBox(s, 2) == DialogResult.Yes)
                    {
                        cb.Delete(gvDonVi.GetFocusedDataRow()["ID"].ToString(), false);
                    }
                }
            }
            else
            {
                if (gcCanBo.DataSource != null && ((DataTable)gcCanBo.DataSource).Rows.Count > 0)
                {
                    if (clsCommon.MsgBox("Bạn có chắc chắn muốn xóa cán bộ này?", 2) == DialogResult.Yes)
                    {
                        cb.Delete(gvDonVi.GetFocusedDataRow()["ID"].ToString(), true);
                    }
                }
            }
            load_gcDonVi_DataSource();
        }

        private void sbtnInHD_Click(object sender, EventArgs e)
        {
            bool ok = true;
            if (string.IsNullOrEmpty(gvDonVi.GetFocusedRowCellValue(gcolNgayHD).ToString().Trim())) 
            {
                XtraMessageBox.Show("Không thực hiện được vì bạn chưa điền NGÀY HỢP ĐỒNG", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ok = false;
            }
            else if (string.IsNullOrEmpty(gvDonVi.GetFocusedRowCellValue(gcolTenCB).ToString().Trim())) 
            {
                XtraMessageBox.Show("Không thực hiện được vì bạn chưa điền TÊN CÁN BỘ", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ok = false;
            }
            else if (string.IsNullOrEmpty(gvDonVi.GetFocusedRowCellValue(gcolDiaChi).ToString().Trim())) 
            {
                XtraMessageBox.Show("Không thực hiện được vì bạn chưa điền ĐỊA CHỈ", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ok = false;
            }
            else if (string.IsNullOrEmpty(gvDonVi.GetFocusedRowCellValue(gcolCMT).ToString().Trim())) 
            {
                XtraMessageBox.Show("Không thực hiện được vì bạn chưa điền CHỨNG MINH THƯ", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ok = false;
            }
            else if (string.IsNullOrEmpty(gvDonVi.GetFocusedRowCellValue(gcolNoiCap).ToString().Trim())) 
            {
                XtraMessageBox.Show("Không thực hiện được vì bạn chưa điền NƠI CẤP", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ok = false;
            }
            else if (string.IsNullOrEmpty(gvDonVi.GetFocusedRowCellValue(gcolNgayCap).ToString().Trim())) 
            {
                XtraMessageBox.Show("Không thực hiện được vì bạn chưa điền NGÀY CẤP", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ok = false;
            }
            else if (string.IsNullOrEmpty(gvDonVi.GetFocusedRowCellValue("TenDV").ToString().Trim())) 
            {
                XtraMessageBox.Show("Không thực hiện được vì bạn chưa điền TÊN ĐƠN VỊ (bên danh mục đơn vị)", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ok = false;
            }

            if (ok)
            {
                int id = (int)gvDonVi.GetFocusedDataRow()["ID"];
                rptHD1 rpt = new rptHD1(id);
                rpt.ShowRibbonPreview();
            }
        }

        private void sbtnTLyHD_Click(object sender, EventArgs e)
        {
            int id = (int)gvDonVi.GetFocusedDataRow()["ID"];
            rptTLHD1 rpt = new rptTLHD1(id);
            rpt.ShowRibbonPreview();
        }

        private void sbtnIn_Click(object sender, EventArgs e)
        {
            //Chú ý: khi thiết kế report mà sử dụng dataset làm nguồn thì khi code cũng phải sử dụng dataset làm nguồn, không được sử dụng datatable
            //nếu không báo cáo có thể sẽ chỉ hiển thị 1 dòng đầu tiên.
            rptDMCanBo rpt = new rptDMCanBo(MaDV, rbDLCap1.Checked); 
            rpt.ShowRibbonPreviewDialog();
        }

        private void sbtnLoc_Click(object sender, EventArgs e)
        {
            if (sbtnLoc.Tag.Equals("LOC"))
            {
                sbtnLoc.Tag = "BL";
                sbtnLoc.Text = "&Bỏ lọc";
                gvDonVi.OptionsView.ShowAutoFilterRow = true;
            }
            else
            {
                gvDonVi.OptionsView.ShowAutoFilterRow = false;
                sbtnLoc.Tag = "LOC";
                sbtnLoc.Text = "&Lọc";
                gvDonVi.ClearColumnsFilter();
            }
        }

        private void sbtnKhoiPhuc_Click(object sender, EventArgs e)
        {
            string s = "Bạn có chắc chắn muốn khôi phục dòng này?";
            if (XtraMessageBox.Show(s, "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes)
            {
                clsDMCanBo cb = new clsDMCanBo();
                cb.OnAction += new clsDMCanBo.OnActionHandler(cls_OnAction);
                cb.OnError += new clsDMCanBo.OnErrorHandler(cls_OnError);
                
                cb.Restore((int)gvDonVi.GetFocusedDataRow()["ID"]);
                load_gcDonVi_DataSource();
            }
        }

        private void sbtnDong_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        #endregion ================================================================================


        #region gvDonvi ===========================================================================
        private void gvDonVi_DataSourceChanged(object sender, EventArgs e)
        {
            lblSoLuong.Text = "Số lượng: " + gvDonVi.RowCount.ToString();

            if (gvDonVi.RowCount == 0)
            {
                sbtnXoa.Enabled = false;
                sbtnIn.Enabled = false;
                sbtnInHD.Enabled = false;
                //sbtnTLyHD.Enabled = false;
                chkKhoiPhuc.Enabled = cbtnSua.Checked;
                sbtnKhoiPhuc.Enabled = false;
            }
            else
            {
                gvDonVi.ClearColumnErrors();
                sbtnXoa.Enabled = cbtnSua.Checked;
                sbtnInHD.Enabled = true;
                sbtnKhoiPhuc.Enabled = chkKhoiPhuc.Checked;
                sbtnIn.Enabled = !chkKhoiPhuc.Checked;
            }

            //Đoạn này xử lý sáng/mờ nút thêm
            if (MaDV == "TC")
                sbtnThem.Enabled = false;
            else
            {
                if (cbtnSua.Checked)
                {
                    DataRow dr = gvDonVi.GetDataRow(GridControl.NewItemRowHandle);
                    if (dr == null) //Nếu dr == null tức là gvDonVi không có newrecord, ngược lại là có
                        sbtnThem.Enabled = !chkKhoiPhuc.Checked;
                    else sbtnThem.Enabled = false;
                }
            }

            gvDonVi_FocusedRowChanged(sender, null);
        }

        private void gvDonVi_ColumnFilterChanged(object sender, EventArgs e)
        {
            lblSoLuong.Text = "Số lượng: " + gvDonVi.RowCount.ToString();
        }

        private void gvDonVi_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            try
            {
                //sbtnTLyHD.Enabled = (bool)gvDonVi.GetFocusedRowCellValue(gcolThanhLy);
            }
            catch
            {
                //sbtnTLyHD.Enabled = false;
            }
        }

        private void gvDonVi_ValidatingEditor(object sender, DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs e)
        {
            if (gvDonVi.FocusedColumn == gcolTien)
            {
                if (string.IsNullOrEmpty(e.Value.ToString().Trim()))
                {
                    e.Value = 0;
                    e.Valid = true;
                }
            }
        }

        private void gvDonVi_InvalidValueException(object sender, DevExpress.XtraEditors.Controls.InvalidValueExceptionEventArgs e)
        {
            e.ErrorText = "Giá trị nhập vào không hợp lệ. Vui lòng nhập lại.";
        }

        private void gvDonVi_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            this.Text = this.Text.Replace("*", "");
            this.Text += "*";

            gvDonVi.Appearance.FocusedRow.BackColor = frmMain.InvalidExceptionColor;
            frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
            frmMain.sEdittingFormName += this.Name;
            e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction;
        }

        private void gvDonVi_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            DataRow dr = gvDonVi.GetDataRow(e.RowHandle);
            if (dr != null)
            {
                e.Valid = RecordIsOK(dr);

                if (e.Valid) // Nếu dữ liệu nhập vào hợp lệ thì thực hiện lưu
                {
                    clsDMCanBo cls = new clsDMCanBo();
                    cls.OnAction += new clsDMCanBo.OnActionHandler(cls_OnAction);
                    cls.OnError += new clsDMCanBo.OnErrorHandler(cls_OnError);

                    if (e.RowHandle == GridControl.NewItemRowHandle)
                    {
                        cls.Insert(dr);
                        enableControlForAddNew(true);
                        lblSoLuong.Text = "Số lượng: " + gvDonVi.RowCount.ToString();
                    }
                    else cls.Update(dr);

                    gvDonVi.Appearance.FocusedRow.BackColor = defaultColor;
                    this.Text = this.Text.Replace("*", "");
                    frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
                    load_gcDonVi_DataSource();  //nạp lại dữ liệu để cập nhật giá trị id cho dòng vừa thêm mới
               }
            }
        }
        #endregion ================================================================================


        #region SUB AND FUNCTION ==================================================================
        private void enableControlForAddNew(bool enabled)
        {
            if (enabled) sbtnThem.Tag = "";
            else sbtnThem.Tag = "AddNew";

            sbtnThem.Enabled = enabled;
            sbtnXoa.Enabled = enabled;
            sbtnLoc.Enabled = enabled;
            grbIn.Enabled = enabled;
            chkKhoiPhuc.Enabled = enabled;
        }

        public void load_rilueChucVu()
        {
            rilueChucVu.DataSource = clsCommon.FillData("select * from DMCHUCVU where isPublic = 1");
        }

        private void loadLueDonVi()
        {
            ucDonVi1.lueDonVi.Properties.DataSource = clsCommon.load_lueDonVi();

            if (BienTc.isQuanHuyen || BienTc.isThanhPho || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.L_DonVi))
            {
                ucDonVi1.lueDonVi.ItemIndex = ucDonVi1.lueDonVi.Properties.GetDataSourceRowIndex("Ma_DT", BienTc.ma_huyen == "" ? "TC" : BienTc.ma_huyen);
                if (BienTc.isQuanHuyen || BienTc.isThanhPho) ucDonVi1.lueDonVi.Properties.ReadOnly = true;
            }
            else ucDonVi1.lueDonVi.ItemIndex = 0;
        }

        private void load_gcDonVi_DataSource()
        {
            clsDMCanBo cb = new clsDMCanBo();
            cb.OnAction += new clsDMCanBo.OnActionHandler(cls_OnAction);
            cb.OnError += new clsDMCanBo.OnErrorHandler(cls_OnError);
            gcCanBo.DataSource = cb.loadData(MaDV, chkKhoiPhuc.Checked, rgThanhly.SelectedIndex);
        }

        #region clsDMCanBo event --------------------------------------------
        private void cls_OnAction(SqlException e)
        {
            if (e.Message.Contains("The DELETE statement conflicted with the REFERENCE constraint"))
                XtraMessageBox.Show("Chưa thể xóa cán bộ này, vì còn có dữ liệu liên quan", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            else cls_OnError(e);
        }

        private void cls_OnError(Exception e)
        {
            XtraMessageBox.Show("Một lỗi chưa được xử lý đã xảy ra. Chi tiết lỗi: \n" + e.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            this.Close();
        }
        #endregion ---------------------------------------------------------

        private bool RecordIsOK(DataRow dr)
        {
            bool ok = true;

            //HÀM NÀY KIỂM TRA DỮ LIỆU NHẬP VÀO KHI THÊM MỚI HAY KHI SỬA MẨU TIN
            string msg = "";
            string madt = dr["Ma_DT"].ToString().Trim().ToUpper();
            Regex regexMaCB = new Regex(@"^(\d|[A-Z]){1}$");    //Mô tả một chuỗi chỉ có 1 ký tự số hoặc 1 ký tự từ A-Z

            //KIỂM TRA MÃ CÁN BỘ =============================================================
            if (madt == "")
            {
                ok = false;
                msg = "MÃ CÁN BỘ không được để trống";
                gvDonVi.SetColumnError(gcolMaCB, msg);
            }
            else if (!regexMaCB.IsMatch(madt.Substring(1, 1)))
            {
                ok = false;
                msg = "MÃ CÁN BỘ không hợp lệ. Hãy nhập lại";
                gvDonVi.SetColumnError(gcolMaCB, msg);
            }
            else if (madt.Substring(0, 1) != dr["Ma_DMDonVi"].ToString().Trim()) //Kiểm tra xem mã cán bộ có bắt đầu bằng mã đơn vị hay không
            {
                ok = false;
                msg = "MÃ CÁN BỘ phải bắt đầu bằng mã đơn vị tương ứng";
                gvDonVi.SetColumnError(gcolMaCB, msg);
            }
            else    //Kiểm tra xem có trùng mã hay không 
            {
                if (gvDonVi.FocusedRowHandle == GridControl.NewItemRowHandle) //check for addnew
                {
                    if (clsDMCanBo.checkMaCB(madt) == false)
                    {
                        ok = false;
                        msg = "MÃ CÁN BỘ bị trùng với một mã chưa thanh lý, vui lòng chọn mã khác";
                        gvDonVi.SetColumnError(gcolMaCB, msg);
                    }
                }
                else    //check for edit
                {
                    if ((bool)dr["Thanh_Ly"] == false)
                    {
                        if (clsDMCanBo.checkMaCB(madt, (int)dr["ID"]) == false)
                        {
                            ok = false;
                            msg = "MÃ CÁN BỘ bị trùng với một mã chưa thanh lý, vui lòng chọn mã khác";
                            gvDonVi.SetColumnError(gcolMaCB, msg);
                        }

                        //dr["Thanh_Ly"] = false;
                    }
                    else
                    {
                        if (clsDMCanBo.checkMaCB(madt, (int)dr["ID"], true) == false)
                        {
                            ok = false;
                            msg = "MÃ CÁN BỘ bị trùng với một mã chưa thanh lý, vui lòng chọn mã khác";
                            gvDonVi.SetColumnError(gcolMaCB, msg);
                        }

                        //dr["Thanh_Ly"] = true;
                    }
                }
            }

            //KIỂM TRA TÊN CÁN BỘ =============================================================
            if (dr["Ten_DT"].ToString().Trim() == "")    //Kiểm tra rỗng
            {
                ok = false;
                msg = "TÊN CÁN BỘ không được để trống. Hãy nhập vào đầy đủ họ tên.";
                gvDonVi.SetColumnError(gcolTenCB, msg);
            }
            else if (dr["Ten_DT"].ToString().Trim().Length < 5)
            {
                ok = false;
                msg = "TÊN CÁN BỘ quá ngắn. Hãy nhập vào đầy đủ họ tên.";
                gvDonVi.SetColumnError(gcolTenCB, msg);
            }


            //KIỂM TRA CHỨC VỤ ===============================================================
            if (dr["MaCV"].ToString().Trim() == "")
            {
                ok = false;
                msg = "Mục CHỨC VỤ không được để trống. Hãy chọn một CHỨC VỤ từ danh sách.";
                gvDonVi.SetColumnError(gcolChucVu, msg);
            }

            //KIỂM TRA MÃ SỐ THUẾ ===============================================================
            if (dr["MST"].ToString().Trim() != "")
            {
                if (gvDonVi.FocusedRowHandle == GridControl.NewItemRowHandle)   //check for addnew
                {
                    if (clsDMCanBo.checkMST(dr["MST"].ToString().Trim()) == false)
                    {
                        ok = false;
                        msg = "MÃ SỐ THUẾ bị trùng. Vui lòng kiểm tra lại";
                        gvDonVi.SetColumnError(gcolMST, msg);
                    }
                }
                else    //check for edit
                {
                    if (clsDMCanBo.checkMST(dr["MST"].ToString().Trim(), (int)dr["ID"]) == false)
                    {
                        ok = false;
                        msg = "MÃ SỐ THUẾ bị trùng. Vui lòng kiểm tra lại";
                        gvDonVi.SetColumnError(gcolMST, msg);
                    }
                }
            }

            //KIỂM TRA SỐ CHỨNG MINH THƯ =========================================================
            if (dr["CMT"].ToString().Trim() != "")
            {
                Regex regexCMT = new Regex(@"^(\d){9,12}$");    //Mô tả một chuỗi chỉ có 9 ký tự số
                if (!regexCMT.IsMatch(dr["CMT"].ToString().Trim()))
                {
                    ok = false;
                    msg = "Số CHỨNG MINH THƯ không hợp lệ. Vui lòng nhập lại";
                    gvDonVi.SetColumnError(gcolCMT, msg);
                }
                else if (gvDonVi.FocusedRowHandle == GridControl.NewItemRowHandle)   //kiểm tra trùng (check for addnew)
                {
                    if (clsDMCanBo.checkCMT(dr["CMT"].ToString().Trim()) == false)
                    {
                        ok = false;
                        msg = "Số CHỨNG MINH THƯ bị trùng. Vui lòng kiểm tra lại";
                        gvDonVi.SetColumnError(gcolCMT, msg);
                    }
                }
                else    //kiểm tra trùng (check for edit)
                {
                    if (clsDMCanBo.checkCMT(dr["CMT"].ToString().Trim(), (int)dr["ID"]) == false)
                    {
                        ok = false;
                        msg = "Số CHỨNG MINH THƯ bị trùng. Vui lòng kiểm tra lại";
                        gvDonVi.SetColumnError(gcolCMT, msg);
                    }
                }
            }

            //KIỂM TRA SỐ HỢP ĐỒNG ===============================================================
            if (dr["SoHD"].ToString().Trim() != "")
            {
                if (gvDonVi.FocusedRowHandle == GridControl.NewItemRowHandle)   //check for addnew
                {
                    if (clsDMCanBo.checkSoHD(dr["SoHD"].ToString().Trim()) == false)
                    {
                        ok = false;
                        msg = "SỐ HỢP ĐỒNG bị trùng. Vui lòng kiểm tra lại";
                        gvDonVi.SetColumnError(gcolSoHD, msg);
                    }
                }
                else    //check for edit
                {
                    if (clsDMCanBo.checkSoHD(dr["SoHD"].ToString().Trim(), (int)dr["ID"]) == false)
                    {
                        ok = false;
                        msg = "SỐ HỢP ĐỒNG bị trùng. Vui lòng kiểm tra lại";
                        gvDonVi.SetColumnError(gcolSoHD, msg);
                    }
                }
            }

            //KIỂM TRA KẾ HOẠCH GIAO ==============================================================
            string KeHoachGiao = dr["KeHoachGiao"].ToString().Trim();
            if (!string.IsNullOrEmpty(KeHoachGiao))
            {
                decimal tempDecimal;
                if (!decimal.TryParse(KeHoachGiao, out tempDecimal))
                {
                    ok = false;
                    msg = "KẾ HOẠCH GIAO nhập vào không hợp lệ. Vui lòng kiểm tra lại";
                    gvDonVi.SetColumnError(gcolKeHoachGiao, msg);
                }
            }

            return ok;
        }
        #endregion ================================================================================


        #region Các thủ tục khác ==================================================================
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Escape)    //Khi đang thêm mới hoặc sửa mà ấn phím ESC
            {
                gvDonVi.CancelUpdateCurrentRow();
                enableControlForAddNew(true);

                gvDonVi.Appearance.FocusedRow.BackColor = defaultColor;
                frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
                this.Text = this.Text.Replace("*", "");
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void lueDonVi_EditValueChanged(object sender, EventArgs e)
        {
            MaDV = ucDonVi1.lueDonVi.GetColumnValue("Ma_DT").ToString().Trim();
            if (gvDonVi.FocusedRowHandle == GridControl.NewItemRowHandle)
            {
                if (MaDV != "TC")
                {
                    clsDMCanBo cb = new clsDMCanBo();
                    cb.OnError += new clsDMCanBo.OnErrorHandler(cls_OnError);
                    gvDonVi.SetRowCellValue(GridControl.NewItemRowHandle, "Ma_DT", cb.generateMaCB(MaDV));
                }
                else load_gcDonVi_DataSource();
            }
            else load_gcDonVi_DataSource();
        }

        private void chkKhoiPhuc_CheckedChanged(object sender, EventArgs e)
        {
            if (chkKhoiPhuc.Checked) gvDonVi.OptionsBehavior.Editable = false;
            else gvDonVi.OptionsBehavior.Editable = cbtnSua.Checked;

            load_gcDonVi_DataSource();
        }
        #endregion ================================================================================
    }
}